"""
    2021-08-08  22:31   by  CYL
    用于实现获取pandas中具体的某一行某一列的数值。
"""
import os
import pandas as pd
import xlrd
import openpyxl
excel_Path = rf"{os.getcwd()}\pandas_data_select_test_0.xls"
DF = pd.read_excel(excel_Path,sheet_name="Sheet1")
print("DF = \n",DF)
#print("DF.info = \n",DF.info)

#   列（离散）----------
# a)获取某一列、某几列
#[1]使用DataFrame[]的方式获取，一般称为“普通索引”。
print("DF某一列 SAMP1= \n",DF["产品编号"])
print("DF某几列 SAMP2= \n",DF[["产品编号","产品类别"]])

#[2]使用DataFrame.iloc[]的方式获取列，一般称为“位置索引”(location index)
#   iloc后的方括号中 逗号之前的部分表示要获取的行的位置，只输入一个冒号，不输入任何数值表示获取所有的行；
#   逗号之后的方括号表示要获取的列的位置，列的位置同样也是从0开始计数。
print("DF.iloc离散列 = \n",DF.iloc[:,[0,3]])  #   获取第0列、第3列的数据并显示。

#   列（连续）----------
# b)获取连续的几列
#   使用DataFrame.iloc获取连续的几列，一般称为“切片索引”。
#   iloc后的方括号中逗号之前的表示选择行，当只传入一个冒号时，表示选择所有行；
#   逗号后面表示要选择的列的位置区间，0:3表示选择EXCEL表中的第1列到第4列之间的值(包含第1列但不包含第4列)
print("DF.iloc连续列 = \n",DF.iloc[:,0:3])

#   行（离散）----------
# c)获取某一行、某几行
print("DF.iloc离散行 SAMP1= \n",DF.iloc[0])
print("DF.iloc离散行 SAMP2= \n",DF.iloc[[0,2]])     #   显示第0行、第2行的内容

#   行(连续)----------
# d)获取连续的某几行
print("DF.iloc连续行 = \n",DF.iloc[0:3])       #   显示从第0行至第2行的内容，即出现冒号时，和for中的range(x,n)一样。

#   选择满足条件的行，一般称为布尔索引----------
# e)
print("DF布尔索引 SAMP1= \n",DF[DF["产品个数"]>=100])
print("DF布尔索引 SAMP2= \n",DF[(DF["产品个数"]>=100) & (DF["产品类别"]=="Cap")])

#   f)行列同时选择----------
#   方法一：普通索引+普通索引(即离散选择显示)
#       需使用DataFrame.loc[]的方法
print("DF行列同时选择：方法一 SAMP1= \n",DF.loc[0,"产品名称"],type(DF.loc[0,"产品名称"]))        #   重点使用这个，因为可以提取出具体的某一格
print("DF行列同时选择：方法一 SAMP2= \n",DF.loc[[0,3],["产品名称"]],type(DF.loc[[0,3],["产品名称"]]))
print("DF行列同时选择：方法一 SAMP3= \n",DF.loc[[0,3],["产品名称","产品类别"]])


#   方法二：位置索引 + 位置索引（即离散选择显示）
print("DF行列同时选择：方法二 SAMP1= \n",DF.iloc[0,1],type(DF.iloc[0,1]))                     #   重点使用这个，因为可以提取出具体的某一格
#   方法二的SAMP2说明：    iloc中的第一个方括号代表了行（离散）选择，第二个方括号代表了列（离散）选择
print("DF行列同时选择：方法二 SAMP2= \n",DF.iloc[[0,2],[0,3]],type(DF.iloc[[0,2],[0,3]]))


#   方法三：布尔索引+普通索引（即离散选择显示）
print("DF行列同时选择：方法三 SAMP1= \n",DF[DF["产品个数"]>=100][["产品名称","产品个数"]])


#   方法四：切片索引+切片索引(即连续选择显示某个区域)
print("DF行列同时选择：方法四 SAMP1= \n",DF.iloc[0:3,0:2])


#   方法五：切片索引+普通索引
#   此时需要使用DataFrame.ix[]的方法
#   注意从pandas 1.0.0开始   .ix方法被.loc方法合并。
print("DF行列同时选择：方法五 SAMP1= \n",DF.loc[1,["产品编号","产品名称"]],type(DF.loc[1,["产品编号","产品名称"]]))
print("DF行列同时选择：方法五 SAMP2= \n",DF.loc[1],type(DF.loc[1]))
print("DF行列同时选择：方法五 SAMP3= \n",DF.loc[0:3,["产品编号","产品名称"]])

#   以下为获取某一行的每个单元格内容的操作
print("DF.columns len = ",len(DF.columns))
print("DF.columns= ",DF.columns)
print("DF.columns[0]=",DF.columns[0],type(DF.columns[0]))
print("DF.columns[3]=",DF.columns[3])
DF_columns = [0]    #   用于储存    列索引
for item in range(0,len(DF.columns)):
    DF_columns.append(DF.columns[item])
DF_columns.pop(0)   #   删除初始化时的那个无效元素
print("DF_columns = ",DF_columns,type(DF_columns))

DF_LINE2 = DF.iloc[1]   #   用于捕获pandas中的第2行数据(除去excel中的第一行默认为columns外,pandas剩下的行计数从0开始)。
print("DF_LINE2=",DF_LINE2,type(DF_LINE2),len(DF_LINE2))    #可以看出这时是一个Series类型的值
print("DF_LINE2[0]=",DF_LINE2[0],type(DF_LINE2[0]))         #[H0]没有学习Numpy之前，我们只能使用这种方式获取单元格的数值。
print("DF_LINE2[3]=",DF_LINE2[3],type(DF_LINE2[3]))
print("DF_LINE2.index=",DF_LINE2.index,type(DF_LINE2.index))
print("DF_LINE2.values=",DF_LINE2.values,type(DF_LINE2.values))#[H0]可以看出此时为一个numpy类型的值，需要学习Numpy的拆分方式

